/**
 * 购物车模块
 */
const shoppingCartModule = {
  namespaced: true, // 启用命名空间
  state: { // state 中保存各组件需要共享的状态数据
    cart: [], // 保存购物车选购商品数据
  },
  getters: { // 相当于 store 中的计算属性
    // 购物车
    cart: state => state.cart,
    // 选中商品总金额
    total: state => state.cart.reduce((sum, prod) => prod.checked ? sum + prod.price * prod.amount : sum, 0) * 100,
    // 是否全选
    allChecked: state => state.cart.every(prod => prod.checked),
    // 所有商品总数量
    totalAmount: state => state.cart.reduce((sum, prod) => sum + prod.amount, 0),
    // 待结算商品
    confirmCart: state => state.cart.filter(prod => prod.checked),
  },
  mutations: { // mutations 中保存同步变更状态数据的方法
    /**
     * 加入购物车实现状态变更
     * @param {*} state 状态数据
     * @param {*} payload 有效载荷 待加入购物车数组的商品对象
     */
    addToCart(state, payload) {
      // 查询数组中当前选购商品的元素
      const has = state.cart.find(prod => prod.id === payload.id)
      // 如果存在，则修改数量，不存在则添加到数组中保存
      if (has) {
        has.amount += payload.amount
      } else {
        state.cart.push({
          ...payload,
          checked: true, // 是否被选中，默认为 false
        })
      }
    },
    /**
     * 从购物车中移除商品的状态变更
     * @param {*} state 状态数据
     * @param {*} payload 有效载荷 待删除购物车中商品对象的信息
     */
    removeFromCart(state, payload) {
      state.cart = state.cart.filter(prod => prod.id !== payload.id)
    },
    /**
     * 修改购物车中商品数量
     * @param {*} state
     * @param {*} payload {id, amount}
     */
    modifyAmount(state, payload) {
      const has = state.cart.find(prod => payload.id === prod.id)
      if (has) {
        has.amount = payload.amount
      }
    },
    /**
     * 修改指定商品的选中状态
     * @param {*} state
     * @param {*} payload {id}
     */
    modifyChecked(state, payload) {
      const has = state.cart.find(prod => payload.id === prod.id)
      if (has) {
        has.checked = !has.checked
      }
    },
    /**
     * 全选/取消全选
     * @param {*} state
     * @param {*} payload { allChecked } allChecked 表示要设置的选中状态 true-全选 false-取消
     */
    modifyAllChecked(state, payload) {
      state.cart.forEach(prod => {
        prod.checked = payload.allChecked
        // if (payload.allChecked === true) {
        //   prod.checked = true
        // } else {
        //   prod.checked = false
        // }
      })
    },
  },
}

export default shoppingCartModule
